package de.fhhannover.inform.wari.grp8.spiel;

import de.fhhannover.inform.studienklassen.semester3.GeneralStatics;
/*
 * @author Michael ,Sofia , Oleg 
 * 05.12.08 erstellt
 * sorgt für die einhaltungen der spielregeln!
 * 
 * modified am 09.12.08
 * unötige updates rausgenommen.
 * 
 */
public class Rules {
	Board mBoard;
	GameFlow mFlow;
	int prevZwangsZugA = 0;
	int prevZwangsZugB = 0;

	public Rules(Board b,GameFlow f) {
		mBoard = b;
		mFlow = f;
		prevZwangsZugA = 0;
		prevZwangsZugB = 0;
	}

	boolean preCheck(int in) {
		boolean go = true;
		
		/*
		 * if (sieg || !mBoard.isStillrunning()) {
		 * mBoard.shouldUpdate("Spiel zu Ende, Sieger:" + siegerString()); }
		 */
		if (!mBoard.isStillrunning()) {
				go = false;
			}
		else if (prevZwangsZugA != 0 || prevZwangsZugB != 0) {
			if (mBoard.getWhoseTurn()) {
				/* mulde die übergeben wurde eigenet sich zum versorgen */
				if (versorger(in, mBoard.getPitA(in))) {
					go = true;
					prevZwangsZugA = 0;
					prevZwangsZugB = 0;
				} else {
					go = false;
				}
			} else {
				/* mulde die übergeben wurde eigenet sich zum versorgen */
				if (versorger(in - 6, mBoard.getPitB(in - 6))) {
					go = true;
					prevZwangsZugA = 0;
					prevZwangsZugB = 0;
				} else {
					go = false;
				}
			}
		}
		return go;
	}

	boolean postCheck() {

		checkZwangsZug();
		boolean sieg = checkeSiegMulden();
		if (sieg || !mBoard.isStillrunning()) {
			// mBoard.shouldUpdate("Spiel zu Ende, Sieger:" + siegerString());
			return false;
		} else {
			return true;
		}
	}

	int checkZwangsZug() {
		int countA = 0;
		int countB = 0;

		for (int i = 0; i < 6; i++) {
			countA = countA + mBoard.getPitA(i);
			countB = countB + mBoard.getPitB(i);

		}
		boolean turn = mBoard.getWhoseTurn();

		if (countB == 0 || countA == 0) {
			if (countB == 0 && countA == 0) {
				System.out.println("	//alle steine genommen brett leer");
				zwangsEnde();
			}

			if (countB == 0 && turn)
				if (versorgeGegner(mBoard.getPitsA())) {
					mBoard.nextPlayer(); // runde überspringen chance zdum
					// versorgen
					prevZwangsZugA++;
					System.out.println("ZwangsZug, ich versorge gegner");
				} else {
					System.out
							.println("ZwangsZug, gegner versorgen nciht möglich");
					prevZwangsZugA++;
					zwangsEnde();
				}
			if (countA == 0 && turn) {
				if (versorgeGegner(mBoard.getPitsB())) {
					// gegner versorg mich
					prevZwangsZugA++;
					System.out.println("ZwangsZug, gegner versorgt mich");
				} else {
					// versorgen nicht möglich
					prevZwangsZugA++;
					System.out
							.println("ZwangsZug, gegner kann mich nicht versorgen");
					zwangsEnde();
				}
			}
			if (countA == 0 && !turn) {
				if (versorgeGegner(mBoard.getPitsB())) {
					mBoard.nextPlayer(); // runde überspringen chance zdum
					// versorgen
					prevZwangsZugB++;
					System.out.println("ZwangsZug, ich versorge gegner");
				} else {
					System.out.println("ZwangsZug, gegner versorgen nciht möglich");
					prevZwangsZugB++;
					zwangsEnde();
				}
			}
			if (countB == 0 && !turn) {
				if (versorgeGegner(mBoard.getPitsA())) {
					prevZwangsZugB++;
					System.out.println("ZwangsZug, gegner versorgt mich");
				} else {
					prevZwangsZugB++;
					System.out.println("ZwangsZug, gegner kann mich nicht versorgen");
					zwangsEnde();
				}
			}
		}

		if (turn) {
			return countA;
		} else {
			return countB;
		}
	}

	boolean checkeSiegMulden() {
		if (mBoard.getWinPitA() > 24 || mBoard.getWinPitA() > 24) {
			mBoard.setStillrunning(false);
			mFlow.shouldUpdate("Spiel zu Ende, mehr als 24 Steine wurden gewonnen");
			return true;
		} else
			return false;
	}

	void zwangsEnde() {
		int[] spielerA = mBoard.getPitsA();
		int[] spielerB = mBoard.getPitsB();

		for (int i = 0; i < spielerA.length; i++) {
			mBoard.addWinPitA(spielerA[i]);
			mBoard.addWinPitB(spielerB[i]);
			mBoard.setPitA(i, 0);
			mBoard.setPitB(i, 0);
		}

		mBoard.setStillrunning(false);
		mFlow.shouldUpdate("Das Spiel musste beendet werden. Es war kein Zug mehr möglich!");
	}

	boolean versorgeGegner(int pits[]) {
		int tmp = pits.length;

		for (int i = 0; i < pits.length; i++) {

			if (pits[i] >= tmp) {
				return true;
			}
			tmp--;

		}
		return false;

	}

	boolean versorger(int index, int anzahl) {
		if ((index + anzahl) >= 6)
			return true;
		else
			return false;
	}

	// -1 -> unentschieden, 1 -> A; 0 -> B
	int getSieger() {
		if (mBoard.getWinPitA() == mBoard.getWinPitB()) {
			return -1;
		} else if (mBoard.getWinPitA() > mBoard.getWinPitB()) {
			return 1;
		} else
			return 0;
	}

	int moveInt(int mulde) {
		while(!mBoard.getUpdate()){nop();}
		int choice = mulde;
		int[] tmp = GeneralStatics.connectArray(mBoard.getPitsA(), mBoard
				.getPitsB());
		int count = mBoard.getPit(mulde);
		// if(mulde>=0&& mulde <=5 && mBoard.getWhoseTurn()){
		tmp[choice] = 0;
		choice++;
		while (count > 0) {
			if (choice % 12 == 0 && choice != 0)
				choice = 0;
			tmp[choice]++;
			count--;
			choice++;

		}
		this.mBoard.setPits(tmp);
		choice--;

		mFlow.shouldUpdate("Mulde " + (mulde + 1) + " Gezogen");
		
		return choice;

	}

	int[] moveArr(int mulde) {
		int choice = mulde;
		if (mulde > 5)
			mulde = mulde - 6;
		int[] tmp = GeneralStatics.connectArray(mBoard.getPitsA(), mBoard
				.getPitsB());
		int count = mBoard.getPit(mBoard.getWhoseTurn(), mulde);
		if (mulde >= 0 && mulde <= 5 && mBoard.getWhoseTurn()) {
			tmp[choice] = 0;
			choice++;
			while (count > 0) {
				if (choice % 12 == 0 && choice != 0)
					choice = 0;
				tmp[choice]++;
				count--;
				choice++;
			}
		}
		return tmp;
	}

	// mulde = wert von 0 bis 11 vom gui
	// dont ask me it just works
	// gibt die mulde 0-11 zurück in der der letzte stein liegen blieb
	int steineNehmen(int letzteMulde) {
		while(!mBoard.getUpdate()){nop();}
		int genommenAnzahl = 0;
		if (mBoard.mWhosTurn) {
			// spieler A -> also mule im feld spielerB
			do {
				if (mBoard.getPit(letzteMulde) > 1
						&& mBoard.getPit(letzteMulde) < 4) {
					genommenAnzahl = genommenAnzahl
							+ mBoard.getPit(letzteMulde);

					mBoard.setPit(letzteMulde, 0);
					letzteMulde--;
				} else {
					break;
				}
			} while (letzteMulde > 5 && letzteMulde < 12);
			mBoard.addWinPitA(genommenAnzahl);
		} else {
			do {
				if (mBoard.getPit(letzteMulde) > 1
						&& mBoard.getPit(letzteMulde) < 4) {
					genommenAnzahl = genommenAnzahl
							+ mBoard.getPit(letzteMulde);

					mBoard.setPit(letzteMulde, 0);
					letzteMulde--;
				} else {
					break;
				}
			} while (letzteMulde > -1 && letzteMulde < 6);
			mBoard.addWinPitB(genommenAnzahl);
		}
		if(genommenAnzahl>0){
		mFlow.shouldUpdate(genommenAnzahl +"Steine Genommen");
		}
		return genommenAnzahl;
	}

	int makeMove(int in) {
		if (in != -1) {

			int last = moveInt(in);
			if (mBoard.getWhoseTurn())
				if (last >= 0 && last <= 5) {
					// eigenes feld sonder regel zwangszug?
				} else if (last >= 6 && last <= 11) {
					steineNehmen(last);
				}
			if (!mBoard.getWhoseTurn())
				if (last >= 6 && last <= 11) {
					// eigenes feld sonder regel zwangszug?
				} else if (last >= 0 && last <= 5) {
					steineNehmen(last);
				}
			// pruefe siegmulden // adde variable /spiel beended, damit der gui
			// sie abfragen kann
			// pruefe dies und jenes

			return 0;
			// der nächste spieler ist eine ki
		} else {
			return -1;
		}
	}

	String siegerString() {
		String sieger;
		if (getSieger() == 1) {
			sieger = mBoard.getNameA();
		} else if (getSieger() == 0) {
			sieger = mBoard.getNameB();
		} else {
			sieger = "Unentschieden";
		}
		return sieger;
	}
	void nop(){
	System.out.println("nop:");
}
}
